/**
  @file     	DESIGNPATTERN_Decorator.h
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_DECORATOR_H
#define CXX_DESIGNPATTERN_DECORATOR_H

#ifndef CXX_DESIGNPATTERN_COMPUTERCOMPONENT_H
#include "DESIGNPATTERN_ComputerComponent.h"
#endif

class Decorator : public ComputerComponent
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~Decorator();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation();

	/**
	* GetComputer
	*
	* @param VOID
	* @return
	*/
	MANUFACTURER_TYPE GetManufacturer();
protected:
	/**
	* Construction
	*
	* @param MANUFACTURER_TYPE eManufacturer
	* @param ComputerComponent* pComputerComponent
	* @return
	*/
	Decorator(MANUFACTURER_TYPE eManufacturer, ComputerComponent* pComputerComponent);

	/**
	* SetComputer
	*
	* @param MANUFACTURER_TYPE eManufacturer
	* @return
	*/
	VOID SetManufacturer(MANUFACTURER_TYPE eManufacturer);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	Decorator();

	/**
	* Copy Construction
	*
	* @param const Decorator& cDecorator
	* @return
	*/
	Decorator(const Decorator& cDecorator);

	/**
	* Assignment
	*
	* @param const Decorator& cDecorator
	* @return Decorator&
	*/
	Decorator& operator=(const Decorator& cDecorator);

public:
protected:
private:
	MANUFACTURER_TYPE m_eManufacturer;
	ComputerComponent* m_pComputerComponent;
};

class ASUSDecorator : public Decorator
{
public:
	/**
	* Construction
	*
	* @param ComputerComponent* pComputerComponent
	* @return
	*/
	ASUSDecorator(ComputerComponent* pComputerComponent);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~ASUSDecorator();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation();

	/**
	* AddedBehavior
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID AddedBehavior();

protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ASUSDecorator(VOID);

	/**
	* Copy Construction
	*
	* @param const ASUSDecorator& cASUSDecorator
	* @return
	*/
	ASUSDecorator(const ASUSDecorator& cASUSDecorator);

	/**
	* Assignment
	*
	* @param const ASUSDecorator& cASUSDecorator
	* @return ASUSDecorator&
	*/
	ASUSDecorator& operator=(const ASUSDecorator& cASUSDecorator);

public:
protected:
private:
};

class DELLDecorator : public Decorator
{
public:
	/**
	* Construction
	*
	* @param ComputerComponent* pComputerComponent
	* @return
	*/
	DELLDecorator(ComputerComponent* pComputerComponent);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~DELLDecorator();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation();

	/**
	* AddedBehavior
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID AddedBehavior();

protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	DELLDecorator(VOID);

	/**
	* Copy Construction
	*
	* @param const DELLDecorator& cDELLDecorator
	* @return
	*/
	DELLDecorator(const DELLDecorator& cDELLDecorator);

	/**
	* Assignment
	*
	* @param const DELLDecorator& cDELLDecorator
	* @return DELLDecorator&
	*/
	DELLDecorator& operator=(const DELLDecorator& cDELLDecorator);

public:
protected:
private:
};

class HPDecorator : public Decorator
{
public:
	/**
	* Construction
	*
	* @param ComputerComponent* pComputerComponent
	* @return
	*/
	HPDecorator(ComputerComponent* pComputerComponent);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~HPDecorator();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation();

	/**
	* AddedBehavior
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID AddedBehavior();

protected:
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	HPDecorator(VOID);

	/**
	* Copy Construction
	*
	* @param const HPDecorator& cHPDecorator
	* @return
	*/
	HPDecorator(const HPDecorator& cHPDecorator);

	/**
	* Assignment
	*
	* @param const HPDecorator& cHPDecorator
	* @return HPDecorator&
	*/
	HPDecorator& operator=(const HPDecorator& cHPDecorator);

public:
protected:
private:
};
#endif	/* >>CXX_DESIGNPATTERN_DECORATOR_H<< */
/* EOF */